package cn.peng.stu4teach.util.base;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModel;


/**
 * Fragment 基类
 */
public abstract class BaseFragment<V extends ViewDataBinding, VM extends ViewModel> extends Fragment {
    protected V            mBinding;
    protected VM           mVm;
    protected Context      mContext;
    protected BaseActivity mActivity;
    protected BaseFragment mFragment;
    private   View         mContentView;

    @Override
    public void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivity = (BaseActivity) getActivity();
        mContext = getContext();
        mFragment = this;
    }

    @Nullable
    @Override
    public View onCreateView (@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (null == mContentView) {
            // 使用 DataBinding 初始化视图
            mBinding = DataBindingUtil.inflate(inflater, seLayoutId(), container, false);
            mBinding.setVariable(setBrVmId(), mVm = setBrVm());

            // 获取 contentView
            mContentView = mBinding.getRoot();

            initData();
            initViewObservable();
        }
        return mContentView;
    }

    @Override
    public void onDestroyView () {
        super.onDestroyView();
        ViewGroup vg = ((ViewGroup) mContentView.getParent());
        if (vg != null) {
            vg.removeView(mContentView);
        }
    }

    /**
     * 设置当前页面使用的布局文件的ID
     *
     * @return 布局layout的id
     */
    public abstract int seLayoutId ();

    /**
     * 在布局文件中声明的 vm 的ID。
     * 假设布局文件中有如下设置：
     * <p>
     * <data>
     *      <variable
     *          name="vm"
     *          type="cn.peng.main.MainVm" />
     * </data>
     * <p>
     * 那么，DataBinding 会使用 name 的值为 name 生成一个 ID , 上面代码生成的 ID 为 BR.vm。
     * <p>
     * 我们这里需要的就是这个ID
     *
     * @return BR的id
     */
    public abstract int setBrVmId ();

    /**
     * 设置布局文件中使用的 vm 对象
     *
     * @return ViewModel 对象
     */
    public abstract VM setBrVm ();

    /**
     * 初始化数据
     */
    public void initData () {

    }

    /**
     * 初始化视图观察者
     */
    public void initViewObservable () {

    }
}
